안녕하세요 해당 제품 구매 후 사용중입니다.
해당 제품 동작을 하나의 신호를 받아서 작동하고 작동하지 않게 하고 싶습니다.
EMG라는 신호를 자동차 키트 아두이노에 수신한다고 가정했을때
EMG가 high 일때 자동차는 모든 동작을 멈추게 하고 싶고
EMG가 low 일때 자동차는 다시 움직였으면 좋겠습니다.
if 문을 사용하면 될 것 같은데 어느 시점에 삽입하면 되는지 다소 어려움이 있어 문의드립니다.
아래 코드문에 제가 생각하는 if문 위치를 작성해보았는데 도움 좀 주시면 감사하겠쓰니다.
작성코드
#include <SoftwareSerial.h>
#include <AFMotor.h>
AF_DCMotor motor_L(1);
AF_DCMotor motor_R(4);
int i;
//초음파센서 출력핀(trig)과 입력핀(echo), 변수, 함수 선언 //
int TrigPin = A0;
int EchoPin = A1;
long duration, distance;
void Obstacle_Check();
void Distance();
void Forward();
void Backward();
void Right();
void Left();
void Stop();
void setup() {
Serial.begin(9600); // PC와의 시리얼 통신속도
Serial.println("Eduino Smart Car Start!");
pinMode(EchoPin, INPUT); // EchoPin 입력
pinMode(TrigPin, OUTPUT); // TrigPin 출력
motor_L.setSpeed(160);
motor_L.run(RELEASE);
motor_R.setSpeed(180);
motor_R.run(RELEASE);
}
if (EMG == HIGH) {
Stop();
}
else {
void loop() {
Forward();
delay(100);
Obstacle_Check();
}
//장애물 확인 및 회피 방향 결정//
void Obstacle_Check() {
int val = random(2);
Distance();
Serial.println(distance);
while (distance < 200) {
if (distance < 180) {
Backward();
delay(250);
Stop();
delay(50);
Distance();
}
else{
if (val ==0) {
Right();
delay(400);
}
else if (val ==1) {
Left();
delay(400);
}
Distance();
}
}
}
}
//거리 감지//
void Distance() {
digitalWrite(TrigPin, LOW);
delay(2);
digitalWrite(TrigPin, HIGH); // trigPin에서 초음파 발생(echoPin도 HIGH)
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
duration = pulseIn(EchoPin, HIGH); // echoPin이 HIGH를 유지한 시간을 저장 한다.
distance = ((float)(340 * duration)/1000) /2;
delay(5);
}
//방향 제어 함수//
void Forward() {
motor_L.run(FORWARD); motor_R.run(FORWARD);
for (i=0; i<200; i=i+20) {
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
for (i=0;i<200;i=i-20){
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
}
void Backward() {
motor_L.run(BACKWARD); motor_R.run(BACKWARD);
for (i=0; i<200; i=i+20) {
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
for (i=0;i<200;i=i-20){
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
}
void Right() {
motor_L.run(FORWARD); motor_R.run(BACKWARD);
for (i=0;i<180;i=i+20){
//j = i*1.3; if(j>=200) j = 200;
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
for (i=180; i<0; i=i-20){
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
}
void Left() {
motor_L.run(BACKWARD); motor_R.run(FORWARD);
for (i=0;i<180;i=i+20){
//j = i*1.3; if(j>=200) j = 200;
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
for (i=180; i<0; i=i-20){
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
}
void Stop() {
motor_L.run(RELEASE); motor_R.run(RELEASE);
for (i=200; i>=0; i=i-20) {
motor_L.setSpeed(i); motor_R.setSpeed(i);
delay(2);
}
}
if문이 loop 부분 안에 있어야됩니다
계속 반복해야 되니까요
제 생각엔 switch문을 사용해서 제어하는 게 어떨까 싶네요
변수 MC선언해서 스위치문에서 EMG가 0과 1일 때 각각 0, 1넣고
밑에서 if문으로 MC==0, 1일 때 작동 각각 설정해주면 되지 않을까요?
블루투스 기능은 사용하지 않고 제가 이 자동차 제품 위에 공기청정기 아두이노를 올릴 생각인데
공기청정기에서 공기가 나쁨 신호를 자동차에서 받아서 공기가 나쁠 때 자동차가 동작을 하지 않고 공기를 정화후 좋을 때 다시 움직이는 방법으로 사용하려고 합니다.
말씀하신 if 문이 loop문 내에 있어야 한다면
void loop() {
Forward();
delay(100);
Obstacle_Check();
}
이 구간 말씀하시는거 맞나요?
void loop() {
if(EMG==HIGH){
stop();
}
else {
Forward();
delay(100);
Obstacle_Check();
}
}
이런식으로 들어오는게 맞나요?
if(dust>250){
void go();
}
else{
void stop();
}
이런 식으로 가시는 게 어떨까요
각각 조건에 맞는 수식 입력해주시구요
해당 함수 사용은 4휠 스마트 RC카 강의자료에 모터드라이버 다루는 예제에서 참조하시면 좋을 것 같습니다.
질문을 보니까 2가지 방법으로 가능할 것같네요
첫번째) 동작함수(forward(), back() 등)안에 조건문을 삽입해 EMG 신호 수신 시, 동작을 멈추는 코드로 구성하는 방법.
두번째) loop()문에 신호를 수신하는 조건문을 생성하고 그 조건문안에 기존 동작코드를 삽입해 신호를 수신할때만 정지하고 아니면 기존 기능을 수행할 수 있도록 코드를 구성하는 방법 시도하시면 될것같습니다.
신호 송수신 체계가 블루투스인지 시리얼통신인지 모르겠지만 사용하는 통신체계에 맞는 코드구성을 해주세요 꼭!
블루투스 기능은 사용하지 않고 제가 이 자동차 제품 위에 공기청정기 아두이노를 올릴 생각인데
공기청정기에서 공기가 나쁨 신호를 자동차에서 받아서 공기가 나쁠 때 자동차가 동작을 하지 않고 공기를 정화후 좋을 때 다시 움직이는 방법으로 사용하려고 합니다.
말씀하신 if 문이 loop문 내에 있어야 한다면
void loop() {
Forward();
delay(100);
Obstacle_Check();
}
이 구간 말씀하시는거 맞나요?
void loop() {
if(EMG==HIGH){
stop();
}
else {
Forward();
delay(100);
Obstacle_Check();
}
}
이런식으로 들어오는게 맞나요?